package cn.edu.hnu.gpg.service;

import cn.edu.hnu.gpg.dto.Account;
import cn.edu.hnu.gpg.entity.Teacher;
import cn.edu.hnu.gpg.entity.User;
import cn.edu.hnu.gpg.entity.enums.Gender;
import cn.edu.hnu.gpg.entity.enums.AcademicDegree;
import cn.edu.hnu.gpg.entity.enums.AcademicTitle;
import java.util.Date;
import java.util.List;

public interface TeacherService {

    /**
     *通过用户索引来查找对应的教师对象
     * @param user_id 教师对应的用户id
     * @return 获得得教师对象
     */
    Teacher findTeacherByUserId(int user_id);

    //teacher_no为教师的工号
    Teacher findTeacherByTeacherNo(String teacher_no);

    List<Teacher> findTeacherLike(Teacher teacher);

    List<Account> findTeacherAccount(Teacher teacher, boolean onlyActiveAccount);

    /**
     * 通过教师ID查找对应的教师对象
     * @param teacher_id 教师的ID
     * @return 教师对象
     */
    Teacher findTeacherByTeacherId(int teacher_id);

    /**
     *用于新建教师（预计流程为，先新建类型为T类型用户，然后在使用该user_id创建教师，从而确保外键约束）
     * @param user_id 用户id(当向教师表插入数据的时候，需要先创建用户，再创建教师信息)
     * @param teacher_number 教师的工号
     * @param id_number 教师的身份证号
     * @param name 教师的姓名
     * @param gender 教师的性别
     * @param birth_date 教师的出生日期
     * @param phone 教师的电话号码
     * @param department_id 教师所属的学院编号
     * @param academic_title 教师的职称
     * @param highest_degree 教师的最高学历
     * @return 新建教师的teacher_id,创建失败时返回0
     */
    int createTeacher(int user_id,String teacher_number,String id_number,String name,Gender gender,Date birth_date,String phone,
                      short department_id,AcademicTitle academic_title,AcademicDegree highest_degree);

    /**
     *创建新的教师的同时将其做为user注册
     * @param teacher_number 教师的工号
     * @param id_number 教师的身份证号
     * @param name 教师的姓名
     * @param gender 教师的性别
     * @param birth_date 教师的出生日期
     * @param phone 教师的电话号码
     * @param department_id 教师所属的学院编号
     * @param academic_title 教师的职称
     * @param highest_degree 教师的最高学历
     * @return 新建教师的teacher_id,创建失败时返回0
     */
    int createTeacherAccount(String teacher_number,String id_number,String name,Gender gender,Date birth_date,String phone,
                             short department_id,AcademicTitle academic_title,AcademicDegree highest_degree);
    int createTeacherAccount(Teacher teacher);

    /**
     * 更改教师的个人信息（设计：修改信息时，必定是对某个表单进行修改，当修改完某一数据时，会将表单所有信息提交，因此只需要重设一遍
     * teacher对象中的各个属性即可实现update的功能）
     * @param user_id 教师对应的用户id
     * @param teacher_number 教师的工号
     * @param id_number 教师的身份证号
     * @param name 教师的姓名
     * @param gender 教师的性别
     * @param birth_date 教师的出生日期
     * @param phone 教师的电话号码
     * @param department_id 教师所属学院的学院编号
     * @param academic_title 教师的职称
     * @param highest_degree 教师的最高学历
     * @return 是否更改成功
     */
    boolean updateInfo(int user_id,String teacher_number,String id_number,String name,Gender gender,Date birth_date,String phone,
                       short department_id,AcademicTitle academic_title,AcademicDegree highest_degree);

    boolean updateTeacherByTeacherNumber(Teacher teacher, boolean skipNull);
}
